/**
 * 学生撤销自己报名的课题
 * 学生撤销之后可以选其他课题
 * 
 * /student/cancelchooise
 * 
 */

const utils = require('../../../utils/index')
const $ = require('../../../utils/common')
const Topics = require('../../../models/researchTopics')
const Topic_Student = require('../../../models/researchTopicStudents')
const MySQLManager = require('../../../utils/MySQLManager');
const sequelize = MySQLManager


const cancel_chooise = async function(req, res) {
    try {
        if (!req.body.year_id) {
            $.sendMessage(res, 1015, '参数错误')
            return
        }

        // 从年度里找到学生
        var student = await Topic_Student.findOne({
            where:{
                student_year: req.body.year_id,
                student_user_name: req.user_name
            }
        })

        if( student == null) {
            $.sendMessage(res, 1015, '您不属于该年度哦')
            utils.create_a_log(req, '学生入所', '撤销报名', '失败')
            return
        }

        // 查看学生的选题状态
        // 状态 0已报名 1未报名 2老师确认
        var student_status = student.dataValues.student_status
        if (student_status == '1') {
            $.sendMessage(res, 1015, '您还未报名，没有课题可撤销')
            utils.create_a_log(req, '学生入所', '撤销报名', '失败')
            return
        }

        if (student_status == '2') {
            $.sendMessage(res, 1015, '您的报名已被老师确认，如需撤销请联系老师撤销对您的报名确认，老师取消后您就可以撤销啦')
            utils.create_a_log(req, '学生入所', '撤销报名', '失败')
            return
        }

        // 如果已报名，就找到报名的课题，课题当前报名人数-1， 学生报名状态设置为1
        if (student_status == '0') {
            var topic = await Topics.findOne({
                where: {
                    id: student.dataValues.topic_id,
                    years: req.body.year_id
                }
            })

            if (topic == null) {
                $.sendMessage(res, 1015, '数据异常，请联系管理员')
                utils.create_a_log(req, '学生入所', '撤销报名', '失败')
                return
            }

            // 事务
            return sequelize.transaction(function (t) {

                return Topic_Student.update(
                {
                    topic_id: null,
                    student_status: '1',
                    teacher_id: '',
                    teacher_fullname: '',
                    topic_name: '',
                },
                {
                    where: {
                        topic_id: topic.dataValues.id,
                        student_status: '0'
                    }
                }
                , 
                {transaction: t}).then(function (user) {
                return Topics.findOne(
                    {
                        where: {
                            id: topic.dataValues.id
                        }
                    }
                    , {transaction: t})
                }).then( topic => {
                    
                return topic.decrement('current_student'
                ,{transaction: t}).then( () => {
                })
                })
            })
            // 请求完整完成
            .then(function (result) {
                res.json({
                    code: 200,
                    message: '撤销报名成功',
                    result: result
                })
                utils.create_a_log(req, '学生入所', '撤销报名')
                return

            })
            // 处理sequalize异常
            .catch(function (err) {
                res.json({
                    code: 1017,
                    message: '撤销报名失败，请联系管理员',
                    err: "err:" + err
                })
                utils.create_a_log(req, '学生入所', '撤销报名', '失败')
                return
            })
            }
    }

    catch(err) {
        $.sendMessage(res, 0000, "err:" + err)
        utils.create_a_log(req, '学生入所', '撤销报名', '失败')
        return
    }
}

module.exports = cancel_chooise